//蓝桥杯
//https://www.lanqiao.cn/problems/499/learning/


//前缀和


#include<bits/stdc++.h>
using namespace std;
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
const int N=2e5+10;
#define INF 0x3f3f3f3f;
typedef long long int ll;
#define close(); std::ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
//----------------------------------------------------------------------------//
vector<int> pos[26];
void solve()
{
	string s;
	cin>>s;
	int n=s.size();

	for(int i=0;i<n;i++)
	{
		int t=s[i]-'a';
		if(!pos[t].size()) pos[t].push_back(-1);//第一位添加-1,相当于第一个出现的字母为-1的位置
		pos[t].push_back(i);
	}

	for(int i=0;i<26;i++)//映射关系从0到25
	{
		if(pos[i].size()) pos[i].push_back(n);//在末尾添加n
	}

	ll ans=0;
	for(int i=0;i<26;i++)
	{
		if(pos[i].size())
		{
			for(int j=1;j<pos[i].size()-1;j++)//加上三部分,不加第一个-1和最后一个n
			{
				ll a=(pos[i][j]-pos[i][j-1]-1);
				ll b=(pos[i][j+1]-pos[i][j]-1);
				ll c=1ll*(pos[i][j]-pos[i][j-1]-1)*(pos[i][j+1]-pos[i][j]-1);
				ans+=(a+b+c);
			}
		}
	}

	ans+=n;//加上每个单独的字母算一个子字符串
	cout<<ans<<'\n';
	
}

int main()
{
	close();
	solve();
	return 0;
}


//***a**a***a****

//第二个a对答案的贡献就是:

// *a
// **a     即与前一个a位置差再减一
// a*
// a**
// a***    即与后一个a位置差再减一
// *a*
// *a**
// *a***
// **a*
// **a**
// **a***   即上述两结果的乘积
// 三部分相加即是每个位置对答案的贡献（别忘了还要加上自身，可以在最后加上长度即可）

